package com.chen.cloudpicture.api.imageSearch.sub;

import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpStatus;
import cn.hutool.json.JSONUtil;
import com.chen.cloudpicture.exception.BusinessException;
import com.chen.cloudpicture.exception.ErrorCode;
import lombok.extern.slf4j.Slf4j;

import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

/**
 * 获取以图搜图的页面地址（step 1）
 * （就是浏览器上显示搜索页面的地址）
 * <p>
 * 流程：
 * 1. 调用网上一个识图网站(百度识图)的一个接口发送请求得到一个html响应
 * 2. 解析 html 响应，找到识图网站在在<script>标签里装着的firstUrl，里面有所有图片的地址
 * 3. 访问解析出来的firstUrl，得到所有搜出的图片列表
 * <p>
 * 构造请求调用百度识图的接口抓取（构造请求抓取已有的以图搜图的网站的数据）（构造form-data表单请求）
 * hutool工具类发送请求，jsoup解析html响应数据
 */
@Slf4j
public class GetImagePageUrlApi {

    /**
     * 获取以图搜图页面地址
     */
    public static String getImagePageUrl(String imageUrl) {
        // 1.准备请求参数
        Map<String, Object> formData = new HashMap<>();
        formData.put("image", imageUrl);
        formData.put("tn", "pc");
        formData.put("from", "pc");
        formData.put("image_source", "PC_UPLOAD_URL");
        // 获取当前时间戳
        long uptime = System.currentTimeMillis();
        // 请求地址
        String url = "https://graph.baidu.com/upload?uptime=" + uptime;

        try {
            // 2.发送请求
            // jsoup 也可以发起请求，但是主要是用来获取和解析html数据的。一般就是Jsoup.connect(url).get()，构建复杂请求还是要用hutool工具包的HttpRequest
            HttpResponse response = HttpRequest
                    .post(url)
                    .header("acs-token", RandomUtil.randomString(1)) // 这里需要指定acs-token 不然会响应系统异常
                    .form(formData)
                    .execute();
            if (response.getStatus() != HttpStatus.HTTP_OK)
                throw new BusinessException(ErrorCode.OPERATION_ERROR, "接口调用失败");
            // 解析响应
            String body = response.body();
            Map<String, Object> result = JSONUtil.toBean(body, Map.class);

            // 3.处理响应结果
            if (result == null || !result.get("status").equals(0))
                throw new BusinessException(ErrorCode.OPERATION_ERROR, "接口调用失败");
            Map<String, Object> data = (Map<String, Object>) result.get("data");
            String rawUrl = (String) data.get("url");
            // 对 URL 进行解码
            String searchResultUrl = URLUtil.decode(rawUrl, StandardCharsets.UTF_8);
            if (StrUtil.isBlank(searchResultUrl))
                throw new BusinessException(ErrorCode.OPERATION_ERROR, "未返回有效的结果地址");
            return searchResultUrl;
        } catch (Exception e) {
            log.error("获取以图搜图页面地址失败", e);
            throw new BusinessException(ErrorCode.OPERATION_ERROR, "搜索失败");
        }
    }

    public static void main(String[] args) {
        // 测试以图搜图功能
        String imageUrl = "https://chen25480-1371220469.cos.ap-shanghai.myqcloud.com/public/1949877657653256193/public/1949877657653256193_Ltuo8WkwaGf8mul6_thumbnail.jpg";
        String result = getImagePageUrl(imageUrl);
        System.out.println("搜索成功，结果 URL：" + result);
    }
}
